1 引子

软件的生命周期跟人的生命周期类似,开发测试阶段只是其中很短的一部分(怀胎十月),而后期的运营维护阶段占据了整个生命周期的绝大部分(人的生长发育到最后down掉的几十年)。

一个比较直观的数据,需求分析和设计占1/5,开发测试占1/5,运营维护占3/5(这个占比可能会比这个大得多,比如一个几个月搞定的项目,可能会使用几年甚至几十年)。

因此,一切工程化手段都希望能够提升软件的可维护性,让运维周期更长,从而降低成本。

模块化概念最先出现在工程设计领域,比较常见的例子就是电脑的各个组成元件,手机的各个元件;在模块化的设计和生产之后,各大厂商可以很方便的进行组装,只需要相应的组件规格匹配就行。

这里就需要一个共同认可的规格文档,说明相应的规范参数,比如CPU的引脚,形状尺寸;内存的金手指数,卡槽位置等。

引申到软件设计上来,模块化的对外规范就是与其他模块的交互入口,可以是接口、信号、事件等传递数据的方式。至于内部使用什么样的逻辑来实现,对外部模块使用者来说其实并不太关注。

2 JavaScript模块化

2.1 什么是模块?

前面大致已经讲到了,模块是一个比较通用的概念,就是一个独立的功能体,与其相似的名词有插件,组件;

2.2 为什么要模块化?

这个问题基本上已经回答了,简单列一下:

  • 模块化后的功能代码更加独立,更容易修改和复用
  • 独立的功能更容易组装,提高生产效率
  • 始终都会有的一条,更容易维护
  • 更容易组装生产、快速响应变化、缩短研发周期

2.3 怎么样做模块化?

还是先回到软件生命周期,看看整个运维过程中可能出现的问题。

  • 代码在运维的过程中经过N轮需求更替,需求的变化可能与原来的有出入甚至是完全推翻
  • 代码运维过程中开发人员的水平参差不齐,编码风格各异,即使有统一的规范也难以保持一致的风格
  • 随着项目的迭代,原来高质量的代码质量逐渐降低,低质量的代码质量降到更低
  • 随着时间的推移,现有的开发人员难以hold住原有代码的时候就面临着废弃或重写

针对上面的这些问题,我们能做什么?

  • 功能抽象
    在生产一个功能的时候,尽可能的将不变的内容和可变的内容分离,让可变的内容可配置,这样固定的部分就可以被最大限度的复用,解决了不断复制一大片代码,修改其中一点作为新用的问题。
  • 学习的代码
    新代码的写入,应该是与现有的代码环境相适应,不管遗产代码质量怎样,都会被作为学习的对象;进一步说,不管你写的这片代码质量怎样,将来都可能被学习甚至是被复制;所以,好好写现在的代码,别误导新同学。
  • 大胆开发,细心测试
    如果现有的代码已经难以被复用了,不得不复制一份的时候,在复制的同时,输出一份可复用的代码,让复制止于此,让后面的同学可以愉快地复用现有代码。
  • 人人为我,我为人人;功在当下,利在千秋
    跳出恶性循环,进入良性迭代,我们的工作虽然只是多增加一只蝴蝶,却能让蝴蝶效应来的更猛烈。

3 参考资料

  1. 回顾:前端模块化和AMD、CMD规范(全)
  2. JavaScript模块化编程
  3. JavaScript模块化加载

最后更新: 2022年03月02日 03:32

原始链接: http://rawbin-.github.io/modules/2015-09-12-javascript-modular/

× 赞赏这个人~
打赏二维码